#!/bin/bash
# Licensed under the OpenIB.org BSD license (FreeBSD Variant) - See COPYING.md
#
# Manage the SRP client daemon (srp_daemon)
#
# chkconfig: - 25 75
# description: Starts/Stops InfiniBand SRP client service
# config:	@CMAKE_INSTALL_FULL_SYSCONFDIR@/srp_daemon.conf
#
### BEGIN INIT INFO
# Provides:       srpd
# Required-Start: $syslog @RDMA_SERVICE@
# Required-Stop: $syslog @RDMA_SERVICE@
# Default-Start: @SRP_DEFAULT_START@
# Default-Stop: @SRP_DEFAULT_STOP@
# Should-Start:
# Should-Stop:
# Short-Description: Starts and stops the InfiniBand SRP client service
# Description: The InfiniBand SRP client service attaches to SRP devices
#	on the InfiniBand fabric and makes them appear as local disks to
#	to the system.  This service starts the client daemon that's
#	responsible for initiating and maintaining the connections to
#	remote devices.
### END INIT INFO

if [ -e /etc/rdma/rdma.conf ]; then
    # RHEL / Fedora.
    RDMA_CONFIG=/etc/rdma/rdma.conf
else
    # OFED
    RDMA_CONFIG=/etc/infiniband/openib.conf
fi
if [ -f $RDMA_CONFIG ]; then
    . $RDMA_CONFIG
fi
pidfile=@CMAKE_INSTALL_FULL_RUNDIR@/srp_daemon.sh.pid
prog=@CMAKE_INSTALL_FULL_SBINDIR@/srp_daemon.sh

checkpid() {
    [ -e "/proc/$1" ]
}

stop_srp_daemon() {
    if ! running; then
        return 1
    fi

    local pid=`cat $pidfile`
    kill $pid
    # timeout 30 seconds for termination
    for i in `seq 300`; do
        if ! checkpid $pid; then
            return 0
        fi
        sleep 0.1
    done
    kill -9 $pid
    # If srp_daemon executables didn't finish by now
    # force kill
    pkill -9 srp_daemon

    return 0
}

# if the ib_srp module is loaded or built into the kernel return 0 otherwise
# return 1.
is_srp_mod_loaded() {
    [ -e /sys/module/ib_srp ]
}

running() {
    [ -f $pidfile ] && checkpid "$(cat $pidfile)"
}

start() {
    if ! is_srp_mod_loaded; then
	echo "SRP kernel module is not loaded, unable to start SRP daemon"
	return 6
    fi
    if running; then
	echo "Already started"
	return 0
    fi

    echo -n "Starting SRP daemon service"

    if [ "$SRP_DEFAULT_TL_RETRY_COUNT" ]; then
        params=$params"-l $SRP_DEFAULT_TL_RETRY_COUNT "
    fi

    setsid $prog $params </dev/null >&/dev/null &
    RC=$?
    [ $RC -eq 0 ] && echo || echo " ...failed"
    return $RC
}

stop() {
    echo -n "Stopping SRP daemon service"

    stop_srp_daemon
    RC=$?
    for ((i=0;i<5;i++)); do
	if ! running; then
	    rm -f $pidfile
	    break
	fi
	sleep 1
    done
    [ $RC -eq 0 ] && echo || echo " ...failed"
    return $RC
}

status() {
    local ret

    if [ ! -f $pidfile ]; then
	ret=3 # program not running
    else
	checkpid "$(cat $pidfile)"
	ret=$? # 1: pid file exists and not running / 0: running
    fi
    if [ $ret -eq 0 ] ; then
	echo "$prog is running... pid=$(cat $pidfile)"
    else
	echo "$prog is not running."
    fi
    return $ret
}

restart() {
    stop
    start
}

condrestart() {
    [ -f $pidfile ] && restart || return 0
}

usage() {
    echo
    echo "Usage: `basename $0` {start|stop|restart|condrestart|try-restart|force-reload|status}"
    echo
    return 2
}

case $1 in
    start|stop|restart|condrestart|try-restart|force-reload)
	[ `id -u` != "0" ] && exit 4 ;;
esac

case $1 in
    start) start; RC=$? ;;
    stop) stop; RC=$? ;;
    restart) restart; RC=$? ;;
    reload) RC=3 ;;
    condrestart) condrestart; RC=$? ;;
    try-restart) condrestart; RC=$? ;;
    force-reload) condrestart; RC=$? ;;
    status) status; RC=$? ;;
    *) usage; RC=$? ;;
esac

exit $RC
